home *** CD-ROM | disk | FTP | other *** search
/ 130 MIDI Tool Box / 130 MIDI Tool Box.iso / czdump02 / czdump02.bas next >
BASIC Source File  |  1987-07-03  |  14KB  |  387 lines

  1.     SCREEN 0,0,0  : COLOR  7,1,1 : CLS : LOCATE 3,1
  2. ?" ***************************************************************************"
  3. ?" *                                                                         *"
  4. ?" *               FileName:  CZDUMP02.BAS, CZDUMP02.EXE                     *"
  5. ?" *  For IBM, ROLAND MPU-401, with CASIO CZ-101/CZ-1000 or other CZ Synths  *"
  6. ?" *                                                                         *"
  7. ?" *   CZDUMP02 puts your MPU-401 into its 'DUMB UART' mode and then gets    *"
  8. ?" *    a patch dump of the CZ Bank and Voice of your choice, from PRESET    *"
  9. ?" *  No. 1 to 16, INTERNAL 1 to 16, CARTRIDGE 1 to 16, or the Sound Area.   *"
  10. ?" *   This is done on MIDI Channel 1.   To run, connect your CZ-101 (on     *"
  11. ?" *    MIDI Channel 1) to the MPU-401 OUT and also the MPU-401 IN.          *"
  12. ?" *    Then type CZDUMP02 <Return>.  Use arrow keys to select the Bank      *"
  13. ?" *     and Voice to be dumped.  Hit ENTER to get the data, <ESC> to EXIT.  *"
  14. ?" *      Don't play notes on your keyboard, screen will fill with data.     *"
  15. ?" *      Compile ONLY with TURBO BASIC Ver. 1.0 on IBM PC/XT or equiv.      *"
  16. ?" *         Please feel free to tinker around to learn about MIDI!          *"
  17. ?" *                                                                         *"
  18. ?" *               By Gino F. Silvestri 06/24/87 22:22 Hrs.                  *"
  19. ?" *                                                                         *"
  20. ?" ***************************************************************************"
  21.     PRINT : PRINT TAB(25) "Press Space Bar to continue"
  22.     WHILE NOT INSTAT : WEND            ' Wait for a keypress here
  23.  
  24. ' ***************************************************************************
  25. ' *                        D E F I N I T I O N S                            *
  26. ' ***************************************************************************
  27.  
  28.     DEFINT A-Z
  29. '              TURBO BASIC Constants:
  30.     %ComdPort   = &H331            ' MPU-401 Command Port on IBM
  31.     %StatPort   = &H331            ' MPU-401 Status Port on IBM
  32.     %DataPort   = &H330            ' MPU-401 Data I/O Port on IBM
  33.     %DRR        = &H40            ' Mask for Data Read Reg. Bit
  34.     %DSR        = &H80            ' Mask for Data Set Ready Bit
  35.     %MaskFlip   = &HFF            ' WAIT Function Bit Mask XOR
  36.     %TimeOut    = 5                ' Tests before declaring dead
  37.     %MPUReset   = &HFF            ' MPU-401 Total Reset Command
  38.     %UARTMode   = &H3F            ' MPU-401 "Dumb UART Mode"
  39.     %ForeColor1 = 7                ' White
  40.     %ForeColor2 = 6                ' Brown
  41.     %ForeColor3 = 14            ' Yellow
  42.     %Black      = 0                ' Black Background & Border
  43.     %Blue       = 1                ' Blue Background & Border
  44.     %Red        = 4                ' Red Background for Errors
  45.     %Flash        = 16            ' Add 16 to Color to Flash
  46.  
  47. ' ---------------------------------------------------------------------------
  48.  
  49.     DATA  &HF0,&H44,&H00,&H00,&H70,&H10        : REM Dump Req. Code
  50. '         Byte: 1    2    3    4    5    6    7
  51. '  >>>>>>>>>>>>>>>>>>> Dump Code String translation: <<<<<<<<<<<<<<<<<<<<<<<
  52.  
  53. '  Bytes 1 & 2 : &HF0, &H44 = CASIO System Exclusive Header (ALWAYS)
  54. '  Bytes 3 & 4 : &H00, &H00 = Filler
  55. '  Byte 5 : &H70 = MIDI Chan.1 (&H71 through &H7F for MIDI Chans. 2 to 16)
  56. '  Byte 6 : &H10 = Indicates that this is a Send Request 1 Type Message
  57.  
  58.     REM Form Feed
  59.  
  60. '  Byte 7 : (Variable) Which Patch : &H20 = INTERNAL 1, (00 to 0F OR 10
  61. '             to 1F are PRESET 1 to 16; 20-2F OR 30-3F = INTERNAL 1 to 16;
  62. '                    40-4F OR 50-5F = CARTRIDGE 1 to 16; &H60 = SOUND AREA
  63.  
  64.     DATA &H70,&H31                    : REM Go-Ahead Code
  65.  
  66. ' ---------------------------------------------------------------------------
  67.  
  68.      StartMsg$ =  "CZDUMP02 - CZ Voice Dump Demo - SELECT Bank, Voice"
  69.      Entr$  = "   Bank (up/down), Voice (left/right), ENTER to dump :"
  70.      Str1$  = "   Dump Request of "
  71.      Str1A$ = "Sent -> TO CZ-101 : "
  72.      Str2$  = "   Dump Request Acknowledge <------- FROM CZ-101 : "
  73.      Str3$  = "   Send Go - Ahead to DUMP ----------> TO CZ-101 : "
  74.      Str4$  = "   Dump of "
  75.      Str4A$ = " <----------- FROM CZ-101 : (256 Bytes)    "
  76.      Str5$  = "   END of REQUEST ACK Sent ----------> TO CZ-101 : "
  77.      TransMsg$ = ">>>>>>> CZ Patch Transmission in Progress <<<<<<<"
  78.      EndMsg$ =   "Dump Complete - Select again or hit <ESC> to EXIT"
  79.      ErrMsg$ =   " MPU-401 or CZ-101 Not Responding! - EXITING "
  80.      Bank$   =   "INTERNAL "            ' Init. Bank Name
  81.      PatchDesired = &H20            ' Default patch to request
  82.      Bank = 1                         ' Default Bank to request
  83.      Patch = 1                    ' Default Patch = 1
  84.  
  85.     DEF FNIndent(St$) = INT((80 - LEN(St$))/2)     ' Calculate Centered Indent
  86.  
  87. ' ---------------------------------------------------------------------------
  88.  
  89.  
  90.  
  91. ' ***************************************************************************
  92. ' *                       I N I T I A L I Z A T I O N                       *
  93. ' ***************************************************************************
  94.  
  95. RSTMPU:                     ' Reset the MPU-401                                 
  96.     CLS                    ' Clear Display
  97.  
  98.     OUT %ComdPort,%MPUReset            ' Send MPU-401 RESET Command
  99.     A = INP(%DataPort)            ' Dummy read to clear buffer
  100.     DELAY .5                ' Wait for port to settle
  101.  
  102.     IF INP(%StatPort) >&HC0 THEN GOTO ErrExit  ' Quit if MPU-401 Not Ready
  103.  
  104.      WAIT %StatPort,%DRR,%MaskFlip        ' Wait for port ready
  105.         OUT %ComdPort,%UARTMode            ' Set MPU-401 "Dumb UART" Mode
  106.      A = INP(%DataPort)            ' Dummy Read to clear buffer
  107.  
  108.      WAIT %StatPort,%DSR,%MaskFlip        ' Wait for "UART" port ready -
  109.                          '  Really crucial!
  110.     REM Form Feed
  111.  
  112. ' ***************************************************************************
  113. ' *                         M A I N   P R O G R A M                         *
  114. ' ***************************************************************************
  115.  
  116. Start:
  117.  
  118.     COLOR %ForeColor1,%Blue,%Blue        ' White on Blue
  119.     CLS
  120.     DELAY .5                ' Wait for screen to settle.
  121.     LOCATE 2,FNIndent(StartMsg$)        ' Center Text
  122.         PRINT StartMsg$;
  123.     LOCATE 4,1
  124.     PRINT Entr$;
  125.     GOSUB UpDisp                ' Display Initial Parameters
  126.  
  127.     KEY (11) ON                ' Enable UP Arrow Key
  128.     KEY (12) ON                ' DOWN Arrow Key
  129.     KEY (13) ON                ' LEFT Arrow Key
  130.     KEY (14) ON                ' RIGHT Arrow Key
  131.  
  132.     
  133.     ON KEY (11) GOSUB BankInc        ' UP Arrow   = Increment Bank
  134.     ON KEY (14) GOSUB BankDec        ' DOWN Arr.  = Decrement Bank
  135.     ON KEY (13) GOSUB PatchInc        ' LEFT Arr.  = Decrement Patch
  136.     ON KEY (12) GOSUB PatchDec        ' RIGHT Arr. = Increment Patch
  137.  
  138. ' ---------------------------------------------------------------------------
  139.  
  140. HandleKey:                        ' Main Wait Loop
  141.  
  142.             In$ = INKEY$                ' Get any keypress
  143.         IF In$ = CHR$(13) THEN GOTO WantDump      ' DUMP on ENTER
  144.         IF In$ = CHR$(27) THEN END        ' QUIT on ESC
  145.         IF In$ = "E" OR In$ = "e" THEN END    ' EXIT if 'E' Also
  146.  
  147.     GOTO HandleKey
  148.  
  149. ' ---------------------------------------------------------------------------
  150.     REM Form Feed
  151. ' ---------------------------------------------------------------------------
  152. '|               O N   K E Y    Subroutines                 |
  153. ' ---------------------------------------------------------------------------
  154.  
  155. BankInc:                        ' UP arrow pressed
  156.             INCR BankSel
  157.             IF BankSel >4 THEN BankSel = 1    ' Reset if past 4
  158.             GOTO BankChange            ' Handle Change in Bank
  159.  
  160. BankDec:                        ' DOWN arrow-Dec. Bank
  161.             DECR BankSel
  162.             IF BankSel <1 THEN BankSel = 4  ' Back to 4 if 0
  163.             GOTO BankChange            ' Handle Change in Bank
  164.  
  165. PatchDec:                        ' LEFT arrow-Dec. Patch
  166.             DECR Patch
  167.             IF Patch = 0 THEN Patch = 16    ' Back to 16 if 0
  168.             GOTO PatchChange        ' Handle Patch Change
  169.  
  170. PatchInc:                        ' RIGHT arrow-Inc.Patch
  171.             INCR Patch            '
  172.             IF Patch = 17 THEN Patch = 1
  173.             GOTO PatchChange        ' Handle Patch Change
  174.  
  175.     GOTO HandleKey                    ' Don't leave yet
  176.  
  177. ' ---------------------------------------------------------------------------
  178.  
  179. BankChange:                    ' Handle Bank Select Change
  180.         SELECT CASE BankSel        ' Process Bank Type
  181.  
  182.             CASE 1            ' If BankSel = 1
  183.             Bank = 0
  184.                     Bank$ = "PRESET   "
  185.  
  186.             CASE 2
  187.             Bank = &H20
  188.                     Bank$ = "INTERNAL "
  189.  
  190.             CASE 3
  191.             Bank = &H40
  192.                     Bank$ = "CARTRIDGE"
  193.  
  194.             CASE 4
  195.             Bank = &H60
  196.                     Bank$ = " Sound Area  "
  197.             Patch = 1        ' Force Patch to 1 for SndArea
  198.                         PatchDesired = &H60    ' Force request code also
  199.                                ' Fall through to BankSet
  200.     END SELECT
  201.  
  202. ' ---------------------------------------------------------------------------
  203.     REM Form Feed
  204.  
  205. BankSet:                    ' Update Bank Code to send
  206.  
  207.     PatchDesired = PatchDesired AND &H0F    ' Kill Left Nibble
  208.     PatchDesired = PatchDesired + Bank    ' Add New Value    
  209.     GOTO UpDisp
  210.  
  211. ' ---------------------------------------------------------------------------
  212.  
  213. PatchChange:                    ' Modify patch No. to send
  214.  
  215.     PatchDesired = PatchDesired AND &HF0    ' Kill Right Nibble
  216.     IF Bank = &H60 THEN Patch = 1 : GOTO UpDisp   ' Sound Area = ONLY &H60
  217.     PatchDesired = PatchDesired + Patch -1    ' Add New Value    (0 to 15)
  218.                         ' Fall through to UpDisp
  219.  
  220. ' ---------------------------------------------------------------------------
  221.  
  222. UpDisp:                            ' Display Bank and Patch Data
  223.     LOCATE 4,56
  224.     COLOR %ForeColor3,%Red,%Red        ' In Yellow on Red
  225.     PRINT " "; Bank$;
  226.     IF BANK = &H60 THEN GOTO Skipatch     ' Don't display a # for this
  227.     LOCATE 4,66
  228.     PRINT Patch ;
  229. Skipatch:
  230.     COLOR %ForeColor1,%Blue,%Blue        ' Back to regular colors
  231.     LOCATE 6,1                ' New Line following
  232.     RETURN
  233.  
  234. ' ---------------------------------------------------------------------------
  235.     REM Form Feed
  236.  
  237. ' ---------------------------------------------------------------------------
  238. '|                 W A N T D U M P  -  Main display function begins          |
  239. ' ---------------------------------------------------------------------------
  240.  
  241. WantDump:                    ' Tell CZ: "I want a DUMP"
  242.     COLOR %ForeColor3,%Red,%Red        ' Yellow on Red
  243.     LOCATE 24,FNindent(TransMsg$)        '
  244.     PRINT TransMsg$;            ' "Transmission" Msg.
  245.  
  246.     COLOR %ForeColor2,%Blue,%Blue        ' Brown on Blue
  247.     LOCATE 6,1
  248.     PRINT Str1$; Bank$; Patch; Str1A$;
  249.     RESTORE                    ' Reinit DATA Pointer
  250.     FOR N = 1 to 6                ' Send 6 bytes of Req. to CZ
  251.  
  252.         READ C                               ' Get DATA to send
  253.         PRINT HEX$(C);" ";        ' Show what we sent
  254.         A = INP(%DataPort)        ' Dummy Read
  255.         GOSUB OutChar            ' Send one character
  256.  
  257.     NEXT
  258.  
  259.     C = PatchDesired            ' Now send Patch Wanted Code
  260.     PRINT HEX$(C);"      ";            ' Show what we sent
  261.     A = INP(%DataPort)            ' Dummy Read
  262.     GOSUB OutChar                ' Send one character
  263.  
  264.     PRINT : PRINT
  265.  
  266. ' ---------------------------------------------------------------------------
  267.  
  268. GetAck:                        ' CZ Acks: "Ready to DUMP".
  269.  
  270.     COLOR %ForeColor3,%Blue,%Blue        ' Yellow on Blue
  271.     PRINT Str2$;
  272.     TimeOut = %TimeOut            ' Prepare for deadman timeout
  273.     WHILE A <> &H30                ' Wait for last CZ Char.
  274.  
  275.        WHILE (INP(%StatPort) AND %DSR) = %DSR       ' Wait for Input Data
  276.           DECR TimeOut : IF TimeOut = 0 THEN GOTO ErrExit  ' If no Reply
  277.        WEND
  278.  
  279.        A = INP(%DataPort)            ' Get Char. FROM CZ
  280.        PRINT HEX$(A);" ";            ' Display code from CZ
  281.  
  282.     WEND    
  283.     PRINT : PRINT
  284.     
  285. ' ---------------------------------------------------------------------------
  286.  
  287.     REM Form Feed
  288.  
  289. TellOK:                        ' Tell CZ "OK, then, DUMP"
  290.  
  291.     COLOR %ForeColor2,%Blue,%Blue        ' Brown on Blue
  292.     PRINT Str3$;
  293.  
  294.     FOR N = 1 to 2                ' Sending only 2 bytes
  295.  
  296.         READ C                          ' From DATA statements
  297.         PRINT HEX$(C);" ";              ' Show what we sent
  298.         A = INP(%DataPort)        ' Dummy Read
  299.         GOSUB OutChar              ' Send out a character
  300.  
  301.     NEXT
  302.     PRINT : PRINT
  303.  
  304. ' ---------------------------------------------------------------------------
  305.  
  306. DispDump:                    ' Display the CZ Dump.
  307.  
  308.     COLOR %ForeColor3,%Blue,%Blue        ' Yellow on Blue
  309.     PRINT Str4$ ; Bank$; Patch; Str4A$ : PRINT
  310.     CC = 0                    ' Count of chars per line.
  311.     PRINT "   ";                ' Init. Blank Space
  312.  
  313.     WHILE A <> &HF7                ' Get Entire dump until F7
  314.  
  315.          WAIT %StatPort,%DSR,%MaskFlip    ' Wait for Data ready
  316.         A = INP(%DataPort)
  317.         PRINT HEX$(A);" ";        ' Display what we got from CZ
  318.  
  319.            INCR CC : IF CC = 37 THEN PRINT : PRINT "   "; : CC = 0  'New Line
  320.  
  321.     WEND
  322.     PRINT : PRINT
  323.  
  324. ' ---------------------------------------------------------------------------
  325.  
  326. SendLastAck:                    ' Send CZ the last ACK.
  327.  
  328.     COLOR %ForeColor2,%Blue,%Blue        ' Brown on Blue
  329.     C = &HF7                ' Last ACK to CZ
  330.     GOSUB OutChar                ' Send it out
  331.     PRINT Str5$; HEX$(C)            ' Show what was sent
  332.  
  333.  
  334. ' ---------------------------------------------------------------------------
  335.     REM Form Feed
  336.  
  337. ThatsAll:
  338.  
  339.     COLOR %ForeColor1,%Blue,%Blue        ' White on Blue
  340.     LOCATE 24,FNindent(EndMsg$)        '
  341.     PRINT EndMsg$;                ' "End" Msg.
  342.  
  343.     GOTO HandleKey                ' Back for more work
  344.  
  345.     END                    ' END of Main Program
  346.  
  347. ' ---------------------------------------------------------------------------
  348.  
  349. ErrExit:                    ' QUIT if I/O failure
  350.     COLOR %ForeColor3+%Flash,%Red,%Red    ' Flashing Yellow on Red
  351.     CLS                    ' Reinit Screen to ALL Red
  352.     LOCATE 10,1,0                ' Position Error Message
  353.     Indent = FNIndent(ErrMsg$)         ' Calculate Centered Indent
  354.     PRINT TAB(Indent)CHR$(201);STRING$(LEN(ErrMsg$),205);CHR$(187)
  355.     PRINT TAB(Indent)CHR$(186);SPACE$(LEN(ErrMsg$));CHR$(186)
  356.     PRINT TAB(Indent)CHR$(186);ErrMsg$;CHR$(186)
  357.     PRINT TAB(Indent)CHR$(186);SPACE$(LEN(ErrMsg$));CHR$(186)
  358.     PRINT TAB(Indent)CHR$(200);STRING$(LEN(ErrMsg$),205);CHR$(188)
  359. '
  360.     DELAY 6                    ' Show Flashing Error a while
  361.     END                    ' Exit on I/O Failure.    
  362.  
  363. ' ---------------------------------------------------------------------------
  364.  
  365. ' ***************************************************************************
  366. ' *                          S U B R O U T I N E S                          *
  367. ' ***************************************************************************
  368.  
  369.  
  370. ' **************************** OutChar SUBROUTINE ***************************
  371.  
  372. OutChar:                     ' Send Data Byte to CZ-101
  373.  
  374.     OUT  %DataPort,C            ' Send Char. out
  375.      A    = INP(%DataPort)            ' Dummy Read to clear buffer
  376.     TimeOut = %TimeOut            ' Init. deadman count
  377.  
  378.      WHILE (INP(%StatPort) AND %DRR) = %DRR    ' Wait for port ready
  379.         DECR TimeOut : IF TimeOut = 0 THEN GOTO ErrExit  ' Yipes! Quit
  380.     WEND
  381.      RETURN
  382.  
  383.     END
  384.  
  385. ' ************************* Last Line of CZDUMP02.BAS ************************
  386. ' Last Edited 07/03/87 2115 Hrs. G. F. Silvestri
  387.